package base.jdk8_demo.lambda.functional;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 函数式接口使用演示
 */
public class FunctionInterfaceTest {
    @Test
    public void testCase(){
        List<Integer> list = Arrays.asList(-1,1,2,3,4,5,6,7,8,9);
        System.out.print("输出所有数据：");
        /*
           传递Predicate函数式接口的匿名实现类给eval()的第二个入参, eval()内部通过循环遍历List,拿到List内部每个
           元素, 并对每个元素进行test()方法调用, 匿名实现类的函数式方法test()接收i这个入参，返回true。

           Predicate 函数式接口有且仅有一个抽象方法 - test(T t), @FunctionalInterface表示是一个函数式接口，
           接口标注有该注解，接口就一定有且仅有一个抽象方法。
         */
        MyPredicate myPredicate = new MyPredicate();
//        eval(list, myPredicate);
        eval(list, i -> true);

        System.out.print("输出所有偶数:");
        /*
            eval(list, n -> {return n%2==0;});
            或者
            匿名对象的test(T t)方法必须返回Boolean，这是 Predicate.test(T t)决定的。
         */
//        eval(list, myPredicate);
        eval(list, n -> n%2==0);

        System.out.print("输出大于 3 的所有数字:");
        eval(list,  n -> n>3);
    }


    public static <T> void eval(List<T> list, Predicate<T> predicate){
        for (T t : list) {
            if (predicate.test(t)) {
                System.out.print(t+",");
            }
        }
        System.out.println();
    }
}
